import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken, getTimeStamp } from '@/utils/auth'
import router from '@/router'

// create an axios instance
//创建一个axios的实例化对象
const service = axios.create({
    /**
     * 基地址就是用的.env.development和.env.production配置的基地址,
     * 由于公司的开发环境和生产环境的基地址不一样,使用基地址就能把保证,不用频繁的修改.
     */
    baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
    ////跨域请求，允许保存cookie
    // withCredentials: true, // send cookies when cross-domain requests
    //超时
    timeout: 5000 // request timeout
})

//请求拦截器
//超时时间
let timeout = 3600
service.interceptors.request.use(async(config) => {
    //判断是否有token值,如果有token值就添加请求头
    if (store.getters.token) {
        //获取cookie的时间戳
        let timeStamp = getTimeStamp()
            //获取当前时间戳
        let current = Date.now();

        //cookie时间戳和当前时间戳的一个差值

        let time = (current - timeStamp) / 1000
            // console.log(time);
            //如果获取的时间相减大于超过规定的时间就说明登录超时了,
            //登录超时就需要退出登录,让它重新登录.
            //这是token的主动处理,但是如果手动改掉时间,那么还是会发送请求的.
        if (time >= timeout || time <= 0) {
            await store.dispatch('user/logout');
            Message.error('登录过期,请重新登录')
            router.push({ path: '/login' })
                //return之后的代码就不执行了
            return
        }
        //如果没有超时,就正常的发请求即可
        config.headers['Authorization'] = `Bearer ${store.getters.token}`
    }

    return config
}, (error) => {
    return Promise.reject(error)
})

//响应拦截请求
service.interceptors.response.use((response) => {
    let res = response.data
        // return res
    if (res.success) {
        return res

    } else {
        //如果是失败的话就会弹窗框提示信息
        // 这次请求失败了，提示出失败原因,Message为elementui的样式
        Message.error(res.message)
            //让这个程序报错
        return Promise.reject(res.message)
    }
}, (error) => {
    // console.dir(error);
    //当token过期之后,服务器会返回1002,需要我们重新登录,
    if (error.response.data.code === 10002) {
        store.dispatch('user/logout');
        Message.error('登录过期,请重新登录')
        router.push({ path: '/login' })
    }
    Message.error(res.Message)
    return Promise.reject(error)
})



// request interceptor
//axios请求拦截器
// service.interceptors.request.use(
//     config => {
//         // do something before request is sent

//         if (store.getters.token) {
//             // let each request carry token
//             // ['X-Token'] is a custom headers key
//             // please modify it according to the actual situation
//             config.headers['X-Token'] = getToken()
//         }
//         return config
//     },
//     error => {
//         // do something with request error
//         console.log(error) // for debug
//         return Promise.reject(error)
//     }
// )

// // response interceptor
// //axios响应拦截器
// service.interceptors.response.use(
//     /**
//      * If you want to get http information such as headers or status
//      * Please return  response => response
//      */

//     /**
//      * Determine the request status by custom code
//      * Here is just an example
//      * You can also judge the status by HTTP Status Code
//      */
//     response => {
//         const res = response.data

//         // if the custom code is not 20000, it is judged as an error.
//         if (res.code !== 20000) {
//             Message({
//                 message: res.message || 'Error',
//                 type: 'error',
//                 duration: 5 * 1000
//             })

//             // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
//             if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
//                 // to re-login
//                 MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
//                     confirmButtonText: 'Re-Login',
//                     cancelButtonText: 'Cancel',
//                     type: 'warning'
//                 }).then(() => {
//                     store.dispatch('user/resetToken').then(() => {
//                         location.reload()
//                     })
//                 })
//             }
//             return Promise.reject(new Error(res.message || 'Error'))
//         } else {
//             return res
//         }
//     },
//     error => {
//         console.log('err' + error) // for debug
//         Message({
//             message: error.message,
//             type: 'error',
//             duration: 5 * 1000
//         })
//         return Promise.reject(error)
//     }
// )

export default service